package hehe.helper.convert;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

/**
 * 类型转换
 *<B>说明：</B>
 *<pre>
 * 略
 *</pre>
 *<B>示例：</B>
 *<pre>
 *  略
 *</pre>
 *<B>日志：</B>
 *<pre>
 *  略
 *</pre>
 *<B>注意事项：</B>
 *<pre>
 *  略
 *</pre>
 */
public class Convert
{
    /**
     * 基本类型对应的方法列表
     *<B>说明：</B>
     *<pre>
     *  略
     *</pre>
     */
    public static final Map<String,String> formats = new HashMap<String,String>() {{}};

    public static String packageName = "";

    static {
        // 初始化静态变量
        formats.put("java.lang.String", "StringFormat");
        formats.put("String", "StringFormat");

        // int, integer, tinyint, smallint, mediumint
        formats.put("java.lang.Integer", "IntFormat");
        formats.put("int", "IntFormat");

        // bigint
        formats.put("java.lang.Long", "LongFormat");
        formats.put("long", "LongFormat");

        // real, double
        formats.put("java.lang.Double", "DoubleFormat");
        formats.put("double", "DoubleFormat");

        // float
        formats.put("java.lang.Float", "FloatFormat");
        formats.put("float", "FloatFormat");

        // bit
        formats.put("java.lang.Boolean", "BooleanFormat");
        formats.put("boolean", "BooleanFormat");

        // date, year
        formats.put("java.sql.Date", "DateFormat");

        // time
        formats.put("java.sql.Time", "TimeFormat");

        // timestamp, datetime
        formats.put("java.sql.Timestamp", "TimestampFormat");

        // decimal, numeric
        formats.put("java.math.BigDecimal", "BigDecimalFormat");

        // unsigned bigint
        formats.put("java.math.BigInteger", "BigIntegerFormat");

        // binary, varbinary, tinyblob, blob, mediumblob, longblob
        // qjd project: print_info.content varbinary(61800);
        formats.put("[B", "toByte");

        // unsigned bigint
        formats.put("Map", "MapFormat");
        formats.put("java.util.Map", "MapFormat");

        Convert.packageName = Convert.getPackageName();
    }

    /**
     * 基本类型对应的方法列表
     *<B>说明：</B>
     *<pre>
     *  略
     *</pre>
     */
    public static String getFormat(String typeString)
    {
        return formats.get(typeString);
    }

    public static Object format(Object value, Field field) throws Exception
    {
        return format(field.getType().getTypeName(),value,field);
    }

    /**
     * 执行强制类型转换
     *<B>说明：</B>
     *<pre>
     *  略
     *</pre>
     * @param type
     * @param value
     * @return Object
     */
    public static Object format(String type, Object value, Field field) throws Exception
    {
        String classType = Convert.getFormat(type);

        // 如找不道对应类型,默认使用cast 转换类型
        if (classType == null) {
            Class <?> cls = Class.forName(type) ;
            return cls.cast(value);
        }

        // 默认format类型
        if (classType.indexOf(".") <= -1) {
            classType = Convert.packageName + "." + classType;
        }

        Class <?> cls = Class.forName(classType) ;
        Class[] argsClass = {value.getClass(),Field.class};
        Object[] args = {value,field};
        Method ownerMethod = null;

        try {
            ownerMethod = cls.getMethod("parse",argsClass);
        } catch (NoSuchMethodException e) {
            return value;
        }

        return ownerMethod.invoke(null,args);
    }

    /**
     * 获取当前类包名
     *<B>说明：</B>
     *<pre>
     * 　略
     *</pre>
     * @return 当前包名
     */
    public static String getPackageName()
    {
        return new Object()    {
            public String getPackageName()
            {
                Class onwClass = this.getClass();
                Package dbPackage =  onwClass.getPackage();
                return  dbPackage.getName();
            }
        }.getPackageName();

    }


    public static Object parse(Object value)
    {
        return null;
    }
}
